home *** CD-ROM | disk | FTP | other *** search
-
- /* @(#)qsort.c 4.1 (Berkeley) 12/21/80 */
-
- static int (*qscmp)();
- static int qses;
-
- qsort(a, n, es, fc)
- char *a;
- unsigned n;
- int es;
- int (*fc)();
- {
- qscmp = fc;
- qses = es;
- qs1(a, a+n*es);
- }
-
- static qs1(a, l)
- char *a, *l;
- {
- register char *i, *j;
- register es;
- char **k;
- char *lp, *hp;
- int c;
- unsigned n;
-
-
- es = qses;
-
- start:
- if((n=l-a) <= es)
- return;
- n = es * (n / (2*es));
- hp = lp = a+n;
- i = a;
- j = l-es;
- for(;;) {
- if(i < lp) {
- if((c = (*qscmp)(i, lp)) == 0) {
- qsexc(i, lp -= es);
- continue;
- }
- if(c < 0) {
- i += es;
- continue;
- }
- }
-
- loop:
- if(j > hp) {
- if((c = (*qscmp)(hp, j)) == 0) {
- qsexc(hp += es, j);
- goto loop;
- }
- if(c > 0) {
- if(i == lp) {
- qstexc(i, hp += es, j);
- i = lp += es;
- goto loop;
- }
- qsexc(i, j);
- j -= es;
- i += es;
- continue;
- }
- j -= es;
- goto loop;
- }
-
-
- if(i == lp) {
- if(lp-a >= l-hp) {
- qs1(hp+es, l);
- l = lp;
- } else {
- qs1(a, lp);
- a = hp+es;
- }
- goto start;
- }
-
-
- qstexc(j, lp -= es, i);
- j = hp -= es;
- }
- }
-
- static qsexc(i, j)
- char *i, *j;
- {
- register char *ri, *rj, c;
- int n;
-
- n = qses;
- ri = i;
- rj = j;
- do {
- c = *ri;
- *ri++ = *rj;
- *rj++ = c;
- } while(--n);
- }
-
- static qstexc(i, j, k)
- char *i, *j, *k;
- {
- register char *ri, *rj, *rk;
- int c;
- int n;
-
- n = qses;
- ri = i;
- rj = j;
- rk = k;
- do {
- c = *ri;
- *ri++ = *rk;
- *rk++ = *rj;
- *rj++ = c;
- } while(--n);
- }
- 107% = *ri;
- *ri++ = *rk;
- *rk++ = *rj;
-